<?php
/**
 * 狡兔之客户端 模拟：web service
 * 来源：狡兔三窟，说明兔子行动最谨慎。
 * User: sgfoot
 * Date: 2017/3/20
 * Time: 10:33
 */
class CoonClient
{
    protected static $url = 'http://domain.mango/%s/%s';
    protected static $key = 'zw9iurtzonhyoymdklnrcuecgk588cdq';

    private static function setUrl()
    {
        switch (ENV) {
            CASE ENV_ONLINE_TEST:
                self::$url = str_replace('domain', 2, self::$url);
                break;
            CASE ENV_ONLINE_PRUDUCT:
                self::$url = str_replace('domain', 3, self::$url);
                break;
            default:
                self::$url = str_replace('domain', 1, self::$url);
                break;
        }
        echo self::$url;
    }
    /**
     * 调用远程的方法，模拟servlet
     * @param $class string 类名
     * @param $method string 方法名
     * @author: wzl
     * @date: 2017
     * @return array|mixed|string
     */
    public static function run($class, $method)
    {
        self::setUrl();
        $params_num = func_num_args();
        $data_params = array();
        if($params_num >= 2) {
            $args_arr = func_get_args();
            for($i = 2; $i < $params_num; $i ++) {
                $data_params[] = $args_arr[$i];
            }
        }
        $error = '';
        $result = self::_run($class, $method, $data_params, $error);
        if(empty($error)) {
            return $result;
        }
        return $error;
    }

    /**
     * 实行调用
     * @param $class string 类名
     * @param $method string 方法名
     * @param $data_params array 参数
     * @author: wzl
     * @date: 2017
     * @return array|bool|mixed
     */
    private static function _run($class, $method, $data_params, &$error)
    {
        $url = sprintf(self::$url, $class, $method);
        $json_result = self::send($url, $data_params);
        if(!json_decode($json_result)) {
            $error = $json_result;
            return false;
        }
        $result = json_decode($json_result, true);
        if($result['status'] == 0) {
            return $result['msg'];
        } else {
            $error = $result;
            return false;
        }
    }
    /**
     * 向远程请求的综合方法
     * @param string $url 请求的URL 可以再拼接act=xxx
     * @param mix $data 需要传输的数据。
     * @return array 已解压的数据
     */
    protected static function send($url, $data)
    {
        $coon = new CoonBase();//先实例coon
        $coon->setOpen();//开启
        $coon->setKey(self::$key);//设置key
        $coon->setOnly();//设置唯一变化值，以防攻击
        $coon->setData($data);//设置需要传输的数据，可任意数据
        $coon->setSign();//生成签名SIGN，必须在setData后执行
        $json = $coon->toJson();//生成json
        $json_result = $coon->postJsonCurl($url, $json);//curl传输
        return $json_result;//获取结果
    }

    /**
     * 设置标准的返回结果
     * @param $status int 代码0成功，非0错误号
     * @param $msg string 提示信息
     * @param bool $isJson 默认false,是否json
     * @author: wzl
     * @date: 2017
     * @return array|mixed|string
     */
    protected static function setResult($status, $msg, $isJson = false)
    {
        $result = array(
            'status' => $status,
            'msg' => $msg,
        );
        return $isJson ? json_encode($result) : $result;
    }
}